﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Windows.Forms;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Data.SqlClient;

namespace FrbaCommerce
{
    public class Usuario
    {
        public int Id { get; set; }
        public string userName { get; set; }
        public string password { get; set; }
        public int id_tipo { get; set; }
        public int id_rol { get; set; }
        public decimal reputacion { get; set; }
        public DateTime fechaCreacion { get; set; }
        public DateTime fechaUltimoLogin { get; set; }
        public Boolean baja { get;set; }
        public Boolean habilitado { get; set; }        

       //Verifica si existe o no el nombre de usuario y no esta dado de baja
        public Boolean verficarUser(string nombre)
        {
            DataSet datos = new DataSet();
            ConexionSql conexion = new ConexionSql();
            string query = " SELECT COUNT(*) FROM ASDF.Usuario WHERE baja= 0 and username = '" + nombre + "';";
            try
            {
                datos = conexion.ejecutarConsulta(query);
                return ((int)datos.Tables[0].Rows[0].ItemArray[0] == 1);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
            }
            return false;           
        }


        //Dado un username, construye el objeto usuario. PARA USUARIOS NO DADOS DE BAJA
        public void getDatosUsuario(String username)
        {
            DataSet datos = new DataSet();
            ConexionSql conexion = new ConexionSql();
            string query = " SELECT * FROM ASDF.Usuario WHERE baja=0 and username = '" + username + "';";
            datos = conexion.ejecutarConsulta(query);
            DataRow fila = datos.Tables[0].Rows[0];
            this.CargarUsuario(fila);
        }

        private void CargarUsuario(DataRow fila)
        {
            this.Id = Convert.ToInt32(fila.ItemArray[0].ToString());
            this.userName = fila.ItemArray[1].ToString();
            this.password = fila.ItemArray[2].ToString();
            this.id_tipo = Convert.ToInt32(fila.ItemArray[3].ToString());
            this.id_rol = Convert.ToInt32(fila.ItemArray[4].ToString());
            this.reputacion = (fila.ItemArray[5].ToString().Length == 0) ? 0: Convert.ToDecimal(fila.ItemArray[5].ToString());
            this.fechaUltimoLogin = (fila.ItemArray[7].ToString().Length == 0) ? DateTime.MinValue : Convert.ToDateTime(fila.ItemArray[7].ToString());
            this.fechaCreacion = Convert.ToDateTime(fila.ItemArray[6].ToString());
            this.baja = Convert.ToBoolean(fila.ItemArray[8].ToString());
            this.habilitado = Convert.ToBoolean(fila.ItemArray[9].ToString());
        }

        public Boolean guardar () 
        {
            DataSet data = new DataSet();
            data.Tables.Add("Consulta");
            data.Tables["Consulta"].Columns.Add("P_username");
            data.Tables["Consulta"].Columns.Add("P_password");
            data.Tables["Consulta"].Columns.Add("P_tipo");
            data.Tables["Consulta"].Columns.Add("P_rol");

            data.Tables["Consulta"].Rows.Add();
            data.Tables["Consulta"].Rows[0]["P_username"] = this.userName;
            data.Tables["Consulta"].Rows[0]["P_password"] = this.password;
            data.Tables["Consulta"].Rows[0]["P_tipo"] = this.id_tipo;
            data.Tables["Consulta"].Rows[0]["P_rol"] = this.id_rol;

            ConexionSql conexion = new ConexionSql();

            try 
            {
              conexion.Consulta(data, "[ASDF].[CREAR_USUARIO]");
              getId();
              return true;
            }

            catch (Exception ex)
            {
                MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
            }
            return false;
        }

       //Crea un usuario cliente default
        public void guardarUsuarioClienteDefault() 
        {
            DataSet data = new DataSet();
            data.Tables.Add("Consulta");
            data.Tables["Consulta"].Columns.Add("P_username");
            data.Tables["Consulta"].Rows.Add();
            data.Tables["Consulta"].Rows[0]["P_username"] = this.userName;

            ConexionSql conexion = new ConexionSql();

            try
            {
                conexion.Consulta(data, "[ASDF].[CREAR_USUARIO_CLIENTE_DEFAULT]");
                getId();
                MessageBox.Show("Se ha registrado el usuario correctamente.");
            }

            catch (Exception ex)
            {
                MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
            }
        }

        //Crea un usuario empresa default
        public void guardarUsuarioEmpresaDefault()
        {
            DataSet data = new DataSet();
            data.Tables.Add("Consulta");
            data.Tables["Consulta"].Columns.Add("P_username");
            data.Tables["Consulta"].Rows.Add();
            data.Tables["Consulta"].Rows[0]["P_username"] = this.userName;

            ConexionSql conexion = new ConexionSql();

            try
            {
                conexion.Consulta(data, "[ASDF].[CREAR_USUARIO_EMPRESA_DEFAULT]");
                getId();
                MessageBox.Show("Se ha registrado el usuario correctamente.");
            }

            catch (Exception ex)
            {
                MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
            }
        }

        public void inhabilitar() 
        {
            setHabilitado(0);
        }

        public void habilitar()
        {
            setHabilitado(1);
        }

        /*VALUE BINARIO = 0 o 1*/
        private void setHabilitado (int value) 
        {
            ConexionSql conexion = new ConexionSql();
            String query = "UPDATE ASDF.Usuario SET habilitado =" +value.ToString() +" where username = '";
            query += this.userName + "';";
            
            try 
            {
                conexion.ejecutarConsulta(query);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
            }
        }

        
        public void updateUltimoLogin() 
        {
            ConexionSql conexion = new ConexionSql();
            String query = "UPDATE ASDF.Usuario set fecha_ultimo_login = SYSDATETIME() where baja=0 and id =" + this.Id + ";";

            try
            {
                conexion.ejecutarConsulta(query);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
            }
        }

        private String getPasswordEncriptado(String password)
        {
            CodigoHash encriptador = new CodigoHash();
            return encriptador.GetHash(password);
        }

        public Boolean modificarPassword(String newPassword) 
        {
            ConexionSql conexion = new ConexionSql();

            String query = "UPDATE ASDF.Usuario SET password = '";
            query += getPasswordEncriptado(newPassword) + "'";
            query += " WHERE id=" + this.Id + ";";

            try 
            {
                conexion.ejecutarConsulta(query);
                return true;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
            }
            return false;
        }

        private void getId() 
        {
            ConexionSql conexion = new ConexionSql();
            DataSet data;
            String query = "SELECT id FROM ASDF.Usuario WHERE baja=0 and username = '" + this.userName + "'" ;
            data = conexion.ejecutarConsulta(query);

            this.Id = Convert.ToInt32(data.Tables[0].Rows[0].ItemArray[0].ToString());
        }

        public Boolean solicitarCambioPassword() 
        {
            return (this.fechaUltimoLogin == DateTime.MinValue);
        }

        public void actualizarReputacion() 
        {
            ConexionSql conexion = new ConexionSql();
            String query = "UPDATE ASDF.Usuario SET reputacion=[ASDF].[REPUTACION_USUARIO](" + this.Id + ") ";
            query += " WHERE id=" + this.Id;

            try 
            {
                conexion.ejecutarConsulta(query);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
            }
            
        }

        public Boolean rolHabilitado() 
        {
            Rol rol = new Rol();
            rol.getDatosPorId(this.id_rol);
            return (rol.habilitado);
        }

        public DataTable getComprasACalificar()
        {
            DataSet data;
            ConexionSql conexion = new ConexionSql();
            String query = "select * from [ASDF].[PUBLICACIONES_POR_CALIFICAR]( " + this.Id + ")";

            try
            {
                data = conexion.ejecutarConsulta(query);
                return data.Tables[0];
            }
            catch (Exception ex)
            {
                MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
            }

            return null;
        }

        public int getCantidadDePublicacionesSinCalificar()
        {
            DataSet data;
            ConexionSql conexion = new ConexionSql();
            String query = "select [ASDF].[CANT_PUBLICACIONES_POR_CALIFICAR] ( " + this.Id.ToString() + ")";

            try
            {
                data = conexion.ejecutarConsulta(query);
                return Convert.ToInt32(data.Tables[0].Rows[0].ItemArray[0]);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
            }

            return 0;
        }
        public List<Usuario> buscarUsuarios(string nombre, string descripcion)
        {
            List<Usuario> usuarios = new List<Usuario>();            
            ConexionSql conexionSql = new ConexionSql();
            DataSet datos = new DataSet();
            string idTipo;
            if (descripcion != "")
            {
                idTipo = new TipoUsuario().obtenerIdDesc(descripcion);
            }
            else
            {
                idTipo = "";
            }

            string query = "SELECT * FROM ASDF.Usuario where baja = 0 ";
            if (nombre.Length != 0 || idTipo.Length != 0)
            {
                query += " AND ";
                if (nombre.Length != 0)
                {
                    query += ArmarCondicion2("username", nombre);
                    if (idTipo.Length != 0)
                    {
                        query += " AND ";
                    }
                }
                if (idTipo.Length != 0)
                {
                    query += ArmarCondicion("tipo", idTipo);
                }                
            }
            datos = conexionSql.ejecutarConsulta(query);
            foreach (DataRow fila in datos.Tables[0].Rows)
            {
                usuarios.Add(this.CargarUsuario2(fila));
            }
            return usuarios;
        }

        private string ArmarCondicion(string nombreCampo, string contenido)
        {
            string query = " " + nombreCampo + " = '" + contenido + "' ";
            return query;
        }

        private string ArmarCondicion2(string nombreCampo, string contenido)
        {
            string query = " " + nombreCampo + " LIKE '%" + contenido + "%' ";
            return query;
        }

        private Usuario CargarUsuario2(DataRow fila)
        {
            Usuario u = new Usuario();
            u.Id = Convert.ToInt32(fila.ItemArray[0].ToString());
            u.userName = fila.ItemArray[1].ToString();
            u.password = fila.ItemArray[2].ToString();
            u.id_tipo = Convert.ToInt32(fila.ItemArray[3].ToString());
            u.id_rol = Convert.ToInt32(fila.ItemArray[4].ToString());
            u.reputacion = (fila.ItemArray[5].ToString().Length == 0) ? 0 : Convert.ToDecimal(fila.ItemArray[5].ToString());
            u.fechaUltimoLogin = (fila.ItemArray[7].ToString().Length == 0) ? DateTime.MinValue : Convert.ToDateTime(fila.ItemArray[7].ToString());
            u.fechaCreacion = Convert.ToDateTime(fila.ItemArray[6].ToString());
            u.baja = Convert.ToBoolean(fila.ItemArray[8].ToString());
            u.habilitado = Convert.ToBoolean(fila.ItemArray[9].ToString());
            return u;
        }

        public void darBaja() 
        {
            DataSet data;
            ConexionSql conexion = new ConexionSql();
            String query = "UPDATE ASDF.Usuario SET baja=1 where id="+ this.Id.ToString();

            try
            {
                data = conexion.ejecutarConsulta(query);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
            }
        }

        public void darBaja (int id) 
        {
            this.Id = id;
            darBaja();
        }

    }
}
